package 笔记.设计模式.代理模式;

import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * @author chenhailong
 * @ClassName: Test
 * @Description: 代理模式
 * @date 2021/7/16 14:38
 * @Version 1.0
 */
public class Test {

    /**
     * 静态代理与动态代理的区别：
     *          1.静态代理需要手动创建代理类，动态代理不需要创建代理类，直接在内存空间里自动生成
     *          2.如果被代理类的接口很多的话，静态代理都要实现这些接口，动态代理是自动实现的
     * @param args
     */
    public static void main(String[] args) {
        /**
         * 代理模式: 类似于装饰模式，装饰模式是在原有的类上做增强功能；而代理模式是帮助你做一些事情，但是主要的事情还是自己来做。
         */
        Proxy proxy = new Proxy(new ZhangSan()); // 静态代理，需要有一个代理的对象
        proxy.behavior();
        System.out.println("-------------静态代理分割线----------------------" );

        // 动态代理
        ZhangSan zhangSan = new ZhangSan();
        Class<? extends ZhangSan> aClass = zhangSan.getClass();
        Method[] methods = aClass.getMethods();
        Marry zhangSan1 =
                (Marry) org.springframework.cglib.proxy.Proxy.newProxyInstance(zhangSan.getClass().getClassLoader(),
                zhangSan.getClass().getInterfaces(), (o, method, objects) -> {
                    if (method.getName().equals("marry")) {
                        method.invoke(zhangSan, objects);
                        System.out.println("我是帮你代理的1");
                    } else {
                        return method.invoke(zhangSan, objects);
                    }
                    return null;
                });
        zhangSan1.marry();
        System.out.println("-------------动态代理分割线1----------------------" );
        Marry zhangSan2 =
                (Marry) org.springframework.cglib.proxy.Proxy.newProxyInstance(zhangSan.getClass().getClassLoader(),
                        zhangSan.getClass().getInterfaces(), new InvocationHandler() {
                            @Override
                            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                                if (method.getName().equals("marry")) {
                                    method.invoke(zhangSan, objects);
                                    System.out.println("我是帮你代理的2");
                                } else {
                                    return method.invoke(zhangSan, objects);
                                }
                                return null;

                            }
                        }
                );

        zhangSan2.marry();

    }

}
